package cn.hallele.leinsteining.ms.support.starter.components.convertor;

import cn.hallele.leinsteining.mc.infrastructure.metadata.io.Page;

import java.util.ArrayList;
import java.util.List;

/**
 * model获取器
 * O：目标层传操作类
 * T：当前层操作实体类型
 * E：目标层操作实体类型
 *
 * @author anle5
 * @since 2024/8/4 21:47
 */
public abstract class ModelDas<O, T, E> {
    protected final O option;

    public ModelDas(O option) {
        this.option = option;
    }

    /**
     * 将T转成E
     *
     * @param t 被转换者
     * @return E 转换后者
     */
    protected abstract E convert(T t);

    /**
     * 将E回转陈T
     *
     * @param e 被回转换者
     * @return E 回转换后者
     */
    protected abstract T revert(E e);

    /**
     * 将T类型List转成E类型List
     *
     * @param tList T类型List
     * @return E类型List
     */
    protected List<E> convertList(List<T> tList) {
        if (tList == null) {
            return null;
        }

        if (tList.isEmpty()) {
            return new ArrayList<>(0);
        }

        return tList.stream().map(this::convert).toList();
    }

    /**
     * 将T类型List回转成E类型List
     *
     * @param eList E类型List
     * @return T类型List
     */
    protected List<T> revertList(List<E> eList) {
        if (eList == null) {
            return null;
        }

        if (eList.isEmpty()) {
            return new ArrayList<>(0);
        }

        return eList.stream().map(this::revert).toList();
    }

    /**
     * 转换page，将T类型page转成E类型page
     *
     * @param page T类型page
     * @return E类型page
     */
    protected Page<E> convertPage(Page<T> page) {
        if (page == null) {
            return null;
        }

        return Page.<E>builder()
                .pageNo(page.getPageNo())
                .pageSize(page.getPageSize())
                .totalNum(page.getTotalNum())
                .totalPages(page.getTotalPages())
                .data(convertList(page.getData()))
                .build();
    }

    /**
     * 转换page，将E类型page回转成T类型page
     *
     * @param page E类型page
     * @return T类型page
     */
    protected Page<T> revertPage(Page<E> page) {
        if (page == null) {
            return null;
        }

        return Page.<T>builder()
                .pageNo(page.getPageNo())
                .pageSize(page.getPageSize())
                .totalNum(page.getTotalNum())
                .totalPages(page.getTotalPages())
                .data(revertList(page.getData()))
                .build();
    }
}
